﻿package  silin.color 
{
	
	
	import flash.display.*;
	import flash.filters.*;
	import flash.geom.*;
	import flash.utils.getTimer;
	import silin.filters.ColorAdjust;
	
	/**
	 * утилиты для работы с цветом
	 * @author silin (http://www.silin.fatal.ru)
	 */
	public class ColorUtilis 
	{
		/**
		 * there's no constructor. экземпляры не создаем
		 */
		public function ColorUtilis()
		{
			trace ("ColorUtilis is a static class and should not be instantiated.")
		}
		/**
		 * сичтает массив из 256 цветов, исходя из парамтров заливки
		 * @param	colors	массив цветов 
		 * @param	alphas	массив прозрачности, по умочанию все 1
		 * @param	ratios	массив пропорций, по умолчанию равномерное распределение
		 * @return
		 */
		public static function getGradientArray(colors:Array, alphas:Array=null, ratios:Array=null) : Array
        {
			var i:int;
			if (colors.length < 2)
			{
				throw(new Error("invalid colors array"));
				return;
			}
			if (!alphas)
			{
				alphas = [];
				for (i = 0; i < colors.length; i++) alphas.push(1);
			}
			if (!ratios)
			{
				ratios = [];
				for (i = 0; i < colors.length; i++) 
					ratios.push(0xFF * i / (colors.length - 1));
			}
            var res:Array=[];
            var shape:Shape = new Shape();
			var g:Graphics = shape.graphics;
            var mtrx:Matrix = new Matrix();
            var bmd:BitmapData = new BitmapData(256, 1, true, 0);
            
            mtrx.createGradientBox(256, 256, 0, 0, 0);
            g.clear();
            g.beginGradientFill("linear", colors, alphas, ratios, mtrx);
            g.drawRect(0, 0, 256, 256);
            g.endFill();
            bmd.draw(shape);
			
			for (i = 0; i < 256; i++) 
			{
                res.push(bmd.getPixel32(i, 0));
			}
			bmd.dispose();
           
            return res;
        }
		/*
		static public function nearColor(clr:int, k:Number=0.15):int
		{
			
			
			var r:int = clr >> 16 & 0xFF;
			var g:int = clr >> 8 & 0xFF;
			var b:int = clr & 0xFF;
			
			
			r = Math.round(r * (1 + (r < 0x80 ? k : -k )));
			g = Math.round(g * (1 + (g < 0x80 ? k : -k )));
			b = Math.round(b * (1 + (b < 0x80 ? k : -k )));
			
			
			
			return r << 16 | g << 8 | b;
		}
		
		
		static public function depthColor(clr:int, val:Number):int
		{
			
			
			var r:int = clr >> 16 & 0xFF;
			var g:int = clr >> 8 & 0xFF;
			var b:int = clr & 0xFF;
			
			
			
			r = Math.round(val * r);
			g = Math.round(val * g);
			b = Math.round(val * b);
			
			
			if (r > 0xFF) r = 0xFF;
			if (g > 0xFF) g = 0xFF;
			if (b > 0xFF) b = 0xFF;
			
			return r << 16 | g << 8 | b;
		}
		*/
		/**
		 * округляет цвет с заданной точностью
		 * @param	clr	цвет(24-битный)
		 * @param	tol	точночть
		 * @return
		 */
		static public function roundColor(clr:int, tol:int):int
		{
			
			var r:int = clr >> 16 & 0xFF;
			var g:int = clr >> 8 & 0xFF;
			var b:int = clr & 0xFF;
			
			var roundFun:Function = Math.floor;
			
			r = tol * roundFun(r / tol);
			g = tol * roundFun(g / tol);
			b = tol * roundFun(b / tol);
			
			return r << 16 | g << 8 | b;
		}
		
		
		 
		
	}
	
}